<?php

namespace Project\ScrumBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Project\ScrumBundle\Entity\Message;
use Project\ScrumBundle\Form\MessageType;
use Project\ScrumBundle\Entity\Affectation;
use Project\ScrumBundle\Form\AvancementType;
use Project\ScrumBundle\Form\ValidationType;
use Project\ScrumBundle\Classe\StatsEnum;
use Project\ScrumBundle\Form\CraType;
use Project\ScrumBundle\Entity\Cra;

class PublicController extends Controller {

    /**
     * Fonction servant a afficher les pages de profil de l'utilisateur
     * @return type
     */
    public function profilAction() {
        $session = $this->get('session');
        //Si l'utilisateur est connecté on affiche l'accueil
        if ($session->get('role') != "") {
            $em = $this->getDoctrine()->getManager();
            $projets = array();
            $user = $session->get('id_user');

            if ($session->get('role') == "ROLE_CLIENT") {
                //On reccupère tous les projets du client pour afficher le compte a rebour
                $projets = $em->getRepository('ProjectScrumBundle:Projet')->findBy(array('refClient' => $user));
            } else if ($session->get('role') == "ROLE_SCRUMMASTER" || $session->get('role') == "ROLE_DEV") {
                //On reccupère tous les projets du dev ou scrummaster pour le compte a rebour
                $userDb = $em->getRepository('ProjectScrumBundle:Utilisateur')->find($user);
                $groupes = $userDb->getGroupeGroupe();
                foreach ($groupes as $groupe) {
                    if (!in_array($groupe->getRefProjet(), $projets)) {
                        $projets[] = $groupe->getRefProjet();
                    }
                }
            }
            return $this->render('ProjectScrumBundle:Public:profil.html.twig', array('projets' => $projets));
        } else {
            return $this->redirect($this->generateUrl('project_authentification_login'));
        }
    }

    /**
     * Fonction servant a afficher le tableau de bord d'un print
     * @return type
     */
    public function tableauDeBordAction() {
        $session = $this->get('session');
        if ($session->get('role') == "ROLE_CLIENT" || $session->get('role') == "ROLE_SCRUMMASTER" || $session->get('role') == "ROLE_DEV") {
            $em = $this->getDoctrine()->getManager();
            $affectations = "";
            $userstoriesdb = "";
            $user = $session->get('id_user');
            if ($session->get('role') == "ROLE_CLIENT") {
                $affectation = new Affectation();
                $validationType = new ValidationType();
                $form = $this->createForm($validationType, $affectation, array('attr' => (array($session->get('id_user')))));

                //On reccupère toutes les user stories du product owner
                $userstoriesdb = $em->getRepository('ProjectScrumBundle:Userstories')->findBy(array('refClient' => $user, 'affectation' => true));
                //On reccupère toutes les affectations pour afficher l'avancement
                $affectations = $em->getRepository('ProjectScrumBundle:Affectation')->findAll();
            } else {
                $affectation = new Affectation();
                $avancementType = new AvancementType();
                $form = $this->createForm($avancementType, $affectation);
                if ($session->get('role') == "ROLE_DEV") {
                    //On reccupère toutes les affectations
                    $affectations = $em->getRepository('ProjectScrumBundle:Affectation')->findBy(array('refUtilisateur' => $user));
                } else {
                    if ($session->get('role') == "ROLE_SCRUMMASTER") {
                        $userstoriesdb = $em->getRepository('ProjectScrumBundle:Userstories')->findAll();
                        //On reccupère toutes les affectations pour afficher l'avancement
                        $affectations = $em->getRepository('ProjectScrumBundle:Affectation')->findAll();
                    }
                }
            }
            $this->updateAvancement($form, $session, $affectation);

            $lastSprint = $this->getLastSprint($em);
            $lastSprintAffect = "";
            if ($lastSprint != "") {
                $lastSprintAffect = $this->getLastSprintAffectation($em, $lastSprint);
            }

            return $this->render('ProjectScrumBundle:Public:tableaudebord.html.twig', array('form' => $form->createView(), 'affectations' => $affectations, 'userstories' => $userstoriesdb, 'lastsprintaffect' => $lastSprintAffect));
        } else {
            return $this->redirect($this->generateUrl('project_authentification_login'));
        }
    }

    /**
     * Fonction servant a stocker ainsi que recupérer puis afficher les messages que s'envoi les utilisateurs
     * @return type
     */
    public function sendMessageAction() {
        $session = $this->get('session');
        //Si l'utilisateur est connecté on affiche ses messages
        if ($session->get('role') != "") {
            $id_user = $session->get('id_user');
            $nomuser = $session->get('nom');
            $date = new \DateTime();
            $message = new Message();
            $MessageType = new MessageType();
            $form = $this->createForm($MessageType, $message, array('attr' => (array($session->get('id_user')))));
            // On récupère la requête
            $request = $this->get('request');
            // On vérifie qu'elle est de type POST
            if ($request->getMethod() == 'POST') {
                // On fait le lien Requête <-> Formulaire
                $form->bind($request);
                // On l'enregistre notre objet dans la base de données
                $em = $this->getDoctrine()->getManager();
                $utilisateurdb = $em->getRepository('ProjectScrumBundle:Utilisateur')->find($id_user);

                $message->setRefExpediteur($utilisateurdb);
                $message->setDateMessage($date);

                $em->persist($message);

                if ($message->getMessage() != null && $message->getRefDestinataire() != null && $message->getRefExpediteur() != null) {
                    $em->flush();
                }
            }

            $resultquery = $this->getUserList($id_user);
            return $this->render('ProjectScrumBundle:Public:messaging.html.twig', array('form' => $form->createView(), 'id' => $id_user, 'nomid' => $nomuser, 'messages' => $resultquery));
        } else {
            return $this->redirect($this->generateUrl('project_authentification_login'));
        }
    }

    /**
     * Fonction servant a creer un Compte Rendu d'Activité
     * @return type
     */
    public function craAction() {
        $session = $this->get('session');
        //Si l'utilisateur est connecté on affiche l'accueil
        if ($session->get('role') == "ROLE_DEV" || $session->get('role') == "ROLE_SCRUMMASTER" || $session->get('role') == "ROLE_CLIENT") {

            $id_user = $session->get('id_user');
            $cra = new Cra();
            $cratype = new CraType();
            $form = $this->createForm($cratype, $cra);
            $request = $this->get('request');
            if ($request->getMethod() == 'POST') {
                $form->bind($request);
                $em = $this->getDoctrine()->getManager();
                $utilisateurdb = $em->getRepository('ProjectScrumBundle:Utilisateur')->find($id_user);
                $cra->setRefUtilisateur($utilisateurdb);
                $usestorytolink = $cra->getUserstoriesUserstorie();
                foreach ($usestorytolink as $stories) {
                    $stories->addCra($cra);
                    $em->persist($stories);
                }

                $em->persist($cra);
                $em->flush();
                return $this->render('ProjectScrumBundle:Public:cra.html.twig', array('form' => $form->createView()));
            }
            return $this->render('ProjectScrumBundle:Public:cra.html.twig', array('form' => $form->createView()));
        } else {
            return $this->redirect($this->generateUrl('project_authentification_login'));
        }
    }

    /**
     * Retourne le sprint en court de la db
     * @param type $em
     * @return type
     */
    private function getLastSprint($em) {
        $lastSprints = $em->getRepository('ProjectScrumBundle:Sprint')->findBy(array('last' => true));
        $lastSprint = '';
        if (!empty($lastSprints)) {
            $lastSprint = $lastSprints[0];
        }
        return $lastSprint;
    }

    /**
     * Retourne la liste des affectations pour le sprint en cours
     * @param type $em
     * @param type $lastSprint
     * @return type
     */
    private function getLastSprintAffectation($em, $lastSprint) {
        return $em->getRepository('ProjectScrumBundle:Affectation')->findBy(array('refSprint' => $lastSprint->getIdSprint()));
    }

    /**
     * Permet de mettre à jour l'avancement d'une user storie
     * @param type $form
     * @param type $session
     * @param type $affectation
     */
    private function updateAvancement($form, $session, $affectation) {
        $request = $this->get('request');
        if ($request->getMethod() == 'POST') {
            // On fait le lien Requête <-> Formulaire
            $form->bindRequest($request);

            $em = $this->getDoctrine()->getManager();
            $userstory = $affectation->getRefUserstorie();

            if ($userstory != null) {
                if ($session->get('role') == "ROLE_CLIENT") {
                    //Si le client à cliqué sur validé, on enregistre le nouveau statut

                    $userstory->setStatut(StatsEnum::VALIDE);
                    $em->persist($userstory);
                } else {
                    if ($form->isValid()) {
                        //Si le dev a cliqué, on met a jours l'avancement
                        $affectationdb = $em->getRepository('ProjectScrumBundle:Affectation')->find($userstory->getIdUserstorie());
                        $affectationdb->setAvancement($affectation->getAvancement());

                        if ($affectationdb->getAvancement() == 100) {
                            $userstory->setStatut(StatsEnum::FINI);
                        } else if ($affectationdb->getAvancement() == 0) {
                            $userstory->setStatut(StatsEnum::NON_COMMENCE);
                        } else {
                            $userstory->setStatut(StatsEnum::EN_COURS);
                        }
                        $em->persist($affectationdb);
                        $em->persist($userstory);
                    }
                }
                $em->flush();
            }
        }
    }

    /**
     * Permet de reccuperer la liste des utilisateurs
     */
    private function getUserList($id_user) {
        $managerEntity = $this->getDoctrine()->getEntityManager();

        $query = $managerEntity->createQuery(
                        'SELECT p FROM ProjectScrumBundle:Message p WHERE p.refExpediteur=:idE OR p.refDestinataire=:Dest '
                )->setParameters(array(
            'idE' => $id_user,
            'Dest' => $id_user,
                ));
        //$messagedb = $manager->getRepository('ProjectScrumBundle:Message')->findBy($condition); 
        //var_dump($query->getArrayResult());
        return $query->execute();
    }

}
